package com.mrlv.ht.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mrlv.ht.utils.Enctype;
import com.mysql.jdbc.StringUtils;

@Controller
public class LoginController {
	
	
	@RequestMapping("/tologin")
	public String tologin() {	
		return "/validate/login";
	}
	
	@RequestMapping("/validate/doLogin")
	public String login(String username, String password,Model model) {
		
		//创建Shiro的验证主体，subject，实际上也可以理解为当前登录的User,只不过Subject的含义更宽泛
		//因为在安全领域中登录系统的对象或许并不是一个真正的用户，也可能是一个线程。
		Subject subject = SecurityUtils.getSubject();
		
		//非空验证
		if(StringUtils.isEmptyOrWhitespaceOnly(username) ||
			StringUtils.isEmptyOrWhitespaceOnly(password)) {
			subject.getSession().setAttribute("errorInfo", "用户名或密码不能为null");
			return "redirect:/";
		}
		
		//UsernamePasswordToken，我们一般管它叫做令牌。
		UsernamePasswordToken token = new UsernamePasswordToken(username, password);
		
		//当调用login(token)方法时，就会去执行自定义Realm里的Authentication(token)方法，
		//当验证失败时，会抛异常。
		try {
			subject.login(token);
			subject.getSession().setAttribute("username", username);
			subject.getSession().setAttribute("password", token.getPassword().toString());
			return "redirect:/index";
		} catch (Exception e) {
			model.addAttribute("errorInfo", "用户名或密码err.username：" + username + "password：" + password+
					"token：" + Enctype.md5(password, username));
			subject.getSession().setAttribute("errorInfo", "用户名或密码err");
			return "/validate/login";
		}
	}
	
	@RequestMapping("/validate/logout")
	public String tologout() {
		return "/validate/logout";
	}
}
